package com.xb.system.service.impl;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xb.model.domain.SysDoc;
import com.xb.system.mapper.db0.SysDocMapper;
import com.xb.system.service.SysDocService;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author cjl
 * @since 2024-05-08
 */
@Service
public class SysDocServiceImpl extends ServiceImpl<SysDocMapper, SysDoc> implements SysDocService {
    @Resource
    private SysDocMapper sysDocMapper;
    /*
    文件上传
     */
    @Override
    public String uploadDoc(MultipartFile file, String path) throws IOException {
        //文件的名称
        String originalFilename = file.getOriginalFilename();
        //文件类型
        String type = FileUtil.extName(originalFilename);
        //文件大小
        long size = file.getSize();
        //获取文件
        File uploadFile = new File(path);
        //判断磁盘文件是否存在
        if (!uploadFile.exists()) {
            uploadFile.mkdirs();//创建磁盘文件
        }
        //文件唯一的标识码
        String uid = IdUtil.fastSimpleUUID();
        String fileUid = uid + StrUtil.DOT + type;
        //获取上传文件
        File fullFile = new File(path + fileUid);//上传文件的完整路径
        //获取文件的md5
        String md5 = SecureUtil.md5(file.getInputStream());
        //MD5查询数据库是否存在该文件
        SysDoc doc = getFileByMd5(md5);
        String url = null;
        if (doc != null) {//文件存在
            url = doc.getDocUrl();
        } else {//文件不存在
            //上传到磁盘
            file.transferTo(fullFile);
            //http://localhost:8800/admin/system/sysDoc/download?fileUid=
            url = "/admin/system/sysDoc/download?fileUid=" + fileUid;
        }
        // 存储数据库
        SysDoc sysDoc = new SysDoc();
        sysDoc.setDocName(originalFilename);
        sysDoc.setDocType(type);
        sysDoc.setDocSize(size / 1024);
        sysDoc.setDocUrl(url);
        sysDoc.setMd5(md5);
        sysDocMapper.insert(sysDoc);
        return url;
    }
    //根据MD5查询文件
    private SysDoc getFileByMd5(String md5) {
        // 查询文件的md5是否存在
        QueryWrapper<SysDoc> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("md5", md5);
        List<SysDoc> docs = sysDocMapper.selectList(queryWrapper);
        return docs.size() == 0 ? null : docs.get(0);
    }
}
